package cn.yaboya.basic.utils;

import cn.yaboya.basic.constant.BaseConstants;
import cn.yaboya.basic.exception.BusinessException;
import cn.yaboya.basic.vo.RegisterVo;
import cn.yaboya.basic.vo.SmsCodeJudgeVo;
import org.springframework.data.redis.core.ReactiveRedisOperations;
import org.springframework.util.StringUtils;
import reactor.core.publisher.Mono;

public class Code {

    private static ReactiveRedisOperations<Object, Object> redisTemplate = null;

    public static void codeJudge(RegisterVo registerVo) {
        // 1.判断手机号不为空
        if(StringUtils.isEmpty(registerVo.getPhone())){
            throw new BusinessException("手机号不能为空");
        }

        // 2.判断图片验证码不为空
        if(StringUtils.isEmpty(registerVo.getImageCodeValue())){
            throw new BusinessException("图片验证码不能为空");

        }
        // 3.判断手机验证码不为空
        if(StringUtils.isEmpty(registerVo.getSmsCodeValue())){

            throw new BusinessException("手机验证码不能为空");
        }
        // 4.判断密码验证码不为空
        if(StringUtils.isEmpty(registerVo.getPassword())){
            throw new BusinessException("密码不能为空");
        }
        // 判断密码是否一致
        if (!registerVo.getPassword().equals(registerVo.getConfirmPassword())){
            throw new BusinessException("两次密码不一致重新输入");
        }
        // 3判断注册手机号和获取手机号验证码时的号码是否一致

        String smsCodeKey = BaseConstants.VerifyCodeConstant.BUSINESS_REGISTER_PREFIX + registerVo.getPhone();
        // 3.2根据k值(传过来的手机号业务建 判断之前是否有过存在3分种没)获取值，如果获取不到就代表手机号验证码错误或已过期 代表不是本人或这过期

        Object  smsCodeValueTmp = redisTemplate.opsForValue().get(smsCodeKey);
        // 代表已经过期
        if (smsCodeValueTmp == null){
            throw new BusinessException("验证码已过期，请重新输入");
        }
        // 4判断短信验证的号码是否一致
        // 4.1获取Reids短信验证码
        String[] split = smsCodeValueTmp.toString().split(":");
        String smsCode = split[0];
        // 4.2判断是否存在不存在则已过期
        if(!smsCode.equalsIgnoreCase(registerVo.getSmsCodeValue())){
            throw new BusinessException("验证码错误，请重新输入");
        }
    }


    public static void isVerifyCode(SmsCodeJudgeVo smsCodeJudge) {
        // 1.判断手机号不为空
        if(StringUtils.isEmpty(smsCodeJudge.getPhone())){
            throw new BusinessException("手机号不能为空");
        }

        // 3.判断手机验证码不为空
        if(StringUtils.isEmpty(smsCodeJudge.getSmsCodeValue())){

            throw new BusinessException("手机验证码不能为空");
        }

        // 3判断注册手机号和获取手机号验证码时的号码是否一致  这个是设置登录时
        String phoneCodeKey = BaseConstants.VerifyCodeConstant.BUSINESS_BINDER_KEY + smsCodeJudge.getPhone();
        // 3.2根据k值(传过来的手机号业务建 判断之前是否有过存在3分种没)获取值，如果获取不到就代表手机号验证码错误或已过期 代表不是本人或这过期
        Object  smsCodeValueTmp = redisTemplate.opsForValue().get(phoneCodeKey);

        // 代表已经过期
        if (smsCodeValueTmp == null){
            throw new BusinessException("验证码已过期，请重新输入");
        }
        // 4判断短信验证的号码是否一致
        // 4.1获取Reids短信验证码
        String[] split = smsCodeValueTmp.toString().split(":");
        String smsCode = split[0];
        // 4.2判断是否存在不存在则已过期
        if(!smsCode.equalsIgnoreCase(smsCodeJudge.getSmsCodeValue())){
            throw new BusinessException("验证码错误，请重新输入");
        }
    }
}
